package cn.itcast.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("user")
public class UserController {

    /**
     *  文件上传
     *      1 DiskFileItemFactory工厂对象 =>(传参) ServletFileUpload对象
     *      2 List<FileItem> fileItems = servletFileUpload.parse(HttpServletRequest request) 解析请求参数
     *      3 fileItem.isFormField()遍历每个项目判断是不是表单, 寻找文件
     *      4 fileItem(File file)写文件
     *      5 new File(路径, 文件名)
     * @return
     */
    @RequestMapping("/fileupload1")
    public String fileupload(HttpServletRequest request) throws Exception {
        System.out.println("文件上传1.....");

        // 1.使用fileup组件完成文件上传, 创建保存路径
        // a.文件位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        System.out.println(path);
        // b.判断该路径是否存在
        File file = new File(path);
        if (!file.exists()){
            // 不存在创建文件夹
            file.mkdirs();
        }

        // 2.解析request对象, 获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List<FileItem> fileItems = upload.parseRequest(request);
        // 遍历
        for (FileItem fileItem : fileItems) {
            // 进行判断,当前item对象是否是上传文件项目
            if (!fileItem.isFormField()) {
                // 说明上传文件项
                // 获取上传文件的名称
                String filename = fileItem.getName();
                System.out.println(filename);
                // 把文件的名称设置唯一值，uuid
                UUID uuid = UUID.randomUUID();
                filename = uuid + "_" + filename;
                // 完成文件上传
                fileItem.write(new File(path, filename));
                // 删除临时文件
                fileItem.delete();
            }
        }
        return "success";
    }

    /**
     *  SpringMVC文件上传
     *      注意:MultipartFile upload 参数名 需要和表单提交文件的name的值一致
     *      方法:
     *          1. 获取文件名
     *              multipartFile.getOriginalFilename()
     *          2. 写文件
     *              multipartFile.transferTo(File dest);
     *
     * @return
     */
    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("SpringMVC文件上传2.....");

        // 1.使用fileup组件完成文件上传, 创建保存路径
        // a.文件位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // b.判断该路径是否存在
        File file = new File(path);
        if (!file.exists()){
            // 不存在创建文件夹
            file.mkdirs();
        }

        // 2.说明上传文件项目
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值，uuid
        UUID uuid = UUID.randomUUID();
        filename = uuid + "_" + filename;
        // 写文件
        upload.transferTo(new File(path, filename));

        return "success";
    }

    /**
     *  跨服务器文件上传
     *  3.创建客户端
     *      Client client = Client.create();
     *  和图片服务器进行连接
     *      WebResource resource = client.resource(path + filename);        参数为对应的请求路径
     *  上传文件
     *      resource.put(upload.getBytes());  字节码我呢见
     *
     * @return
     */
    @RequestMapping("/fileupload3")
    public String fileupload3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器文件上传3.....");

        // 1.定义上传文件服务器路径
        String path = "http://localhost:8080/springmvc/uploads/";

        // 2.说明上传文件项目
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值，uuid
        UUID uuid = UUID.randomUUID();
        filename = uuid + "_" + filename;

        // 3.创建客户端
        Client client = Client.create();
        // 和图片服务器进行连接
        WebResource resource = client.resource(path + filename);
        // 上传文件
        resource.put(upload.getBytes());

        return "success";
    }
}
